package org.fjsei.yewu.service.core;

import lombok.extern.slf4j.Slf4j;
import md.specialEqp.Eqp;
import md.specialEqp.Equipments;
import md.specialEqp.inspect.Detail;
import md.specialEqp.inspect.Isp;
import md.specialEqp.inspect.Task;
import md.specialEqp.type.PipingUnit;
import org.fjsei.yewu.repository.Teacher;
import org.fjsei.yewu.repository.TeacherRepository;
import org.fjsei.yewu.resolver.Comngrql;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;


@Service
@Slf4j
public class TaskServiceImpl extends Comngrql implements TaskService {
    @PersistenceContext(unitName = "entityManagerFactorySei")
    private EntityManager emSei;

    /**取消任务：
     * @return 正常='', 否则给出提示信息。
     *  */
    @Transactional
    public String cancellationTask(String taskId)
    {
        //两阶段提交Atomikos XA的跨多个数据库事务机制 if(!emSei.isJoinedToTransaction())   emSei.joinTransaction(); implementation 'com.atomikos:transactions-jta:5.0.9'
        Task task=entityOf(taskId,Task.class);
        //Task task = taskRepository.findById(taskId).orElse(null);
        Assert.isTrue(task != null,"未找到task:"+taskId);
        //这实体发现之间关联的情况越多的，删除就越麻烦咯，关系复杂。
        AtomicInteger repErrCnt= new AtomicInteger();
        //	throw new InvalidException("还有ISP关联"+taskId);
        for (Detail detail : task.getDets()) {
            //Detail detail= task.getDets().get(0);
            Isp isp=detail.getIsp();
            //Isp不管了,？有些确实需要删除的,  根据Isp的状态判定，已经终结的报告Isp不能删除。
            if(null!=isp){
                //isp.setBus(null);
                //已经关联的Report的清理？

                if(!isp.getReps().isEmpty())	 repErrCnt.getAndIncrement();
                //特别的字段@ManyToMany需要清理掉： ispMen 解除关系
                //Set<User>  mens= isp.getIspMen();
                //mens.forEach(a -> a.getIsp().remove(isp));
                //若不解除关系不能立即给正确的应答，在缓存期限时间内做关联查找会报错某关联id找不到。
                //下面这两行若去掉一个都会导致关联id找不到，除非cache缓存时间过了才行，或者其他操作影响。
                //isp.getTask().getIsps().remove(isp);
                //爆慢时存在的注解Isp @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY) Detail bus;
                emSei.remove(isp);  //CascadeType isp物理表bus_id跟随自动删除detail，而我则后面再做的remove(detail);所以不能直接remove(isp)？【实际自动】关联删除detail？爆慢！！
                //emSei.flush();
            }
            //清理关联的Charging? 收费计算信息清理。对方表有我放的ID存储着，报错！不能简单删除关联id;【麻烦】一个连接着另外一个id;连串清理。
            //清理关联Charging.pipus<>
            detail.getFees().forEach(a -> {
                List<PipingUnit> pipingUnits=a.getPipus();
                //Assert.isTrue(pipingUnits.isEmpty(),"关联Charging.pipus未清理");
                //多对多@ManyToMany反而更容易清理：可自动删除掉中间表数据。
                emSei.remove(a);
            } );
            //被引用的：管道单元锁要清除 pipus，不然就报错了。
//			detail.getPipus().forEach(a -> {
//				a.setDet(null);
//			} );
            emSei.remove(detail);
            //有remove(isp);没有remove(detail);也很慢的，但是detail并没有删除，可能锁冲突问题，爆慢。有remove(detail);同样慢，删了detail;
            //没有remove(isp);有remove(detail); 就快很多！，#但是Isp保留;
            //emSei.flush();
            log.info("已删除-管理漏 校对的：Isp={} Bus={}",isp==null? '无':isp.getId(),detail.getId());
            //if(repErrCnt.get()>50)  break;
        }

        task.getDets().clear();
//			Assert.isTrue(task.getDets().isEmpty(),"还有ISP关联"+taskId);
        emSei.remove(task);
        emSei.flush();

        if(0==repErrCnt.get()){
            return	"";
        }
        else {
            if(!task.getDets().isEmpty())
                return "还有ISP关联,有" + task.getDets().size() + "条";
            else
                return "这次清理关联Report有" + repErrCnt.get() + "条";
        }
    }
}

